const {
  get,
  set
} = require('../db/redis')

// 处理 post data
const getPostData = (req) => {
  const promise = new Promise((resolve, reject) => {
    if (req.method !== 'POST') {
      resolve({})
      return
    }
    // 对于 content-type 不是 application/json的数据简单处理返回 {}
    if (req.headers['content-type'] !== 'application/json') {
      resolve({})
      return
    }
    // post发送的数据会被写入缓冲区中(buffer)，需要通过resquest的 data 和 end 事件来进行数据拼接处理
    // 这种做法是为了解决网络IO的性能瓶颈，使用 stream 来接收数据
    let postData = ''
    req.on('data', chunk => {
      postData += chunk // 用 + 进行字符串拼接时，会自动对chunk进行字符串转换，等同于 chunk.toString()
    })
    req.on('end', () => {
      if (!postData) {
        resolve({})
        return
      }
      resolve(
        JSON.parse(postData)
      )
    })
  })
  return promise
}

// 获取 cookie 的过期时间
const getCookieExpires = () => {
  const d = new Date()
  d.setTime(d.getTime() + (24 * 60 * 60 * 1000))
  return d.toGMTString()
}

// 解析 cookie
const parseCokie = (req) => {
  req.cookie = {}
  const cookieStr = req.headers.cookie || ''
  cookieStr.split(';').forEach(item => {
    if (!item) {
      return
    } else {
      const arr = item.split('=')
      const key = arr[0].trim()
      const val = arr[1].trim()
      req.cookie[key] = val
    }
  })
}


// session 数据
let SESSION_DATA = {}

// 解析 session (不使用 redis)
const parseSession = (req) => {
  let needSetCookie = false
  let userId = req.cookie.userid
  if (userId) {
    if (!SESSION_DATA[userId]) {
      SESSION_DATA[userId] = {}
    }
  } else {
    needSetCookie = true
    userId = `${Date.now()}_${Math.random()}`
    SESSION_DATA[userId] = {}
  }
  req.session = SESSION_DATA[userId]

  // req.session 取到的是 userId 对应的那份数据
  console.log('SESSION_DATA', req.session)
  return {
    userId,
    needSetCookie
  }
}

// 解析 session (使用 redis)
const parseSessionWithRedis = async (req) => {
  let needSetCookie = false
  let userId = req.cookie.userid

  if (!userId) {
    needSetCookie = true
    userId = `${Date.now()}_${Math.random()}`
    // 初始化 redis 中的 session 值
    set(userId, {})
  }

  // 获取 session
  req.sessionId = userId
  // 使用 async 保证先执行 get 之后再 return Promise.resolve({ userId, needSetCookie })
  await get(req.sessionId).then(sessionData => {
    if (sessionData == null) {
      // 初始化 redis 中的 session 值
      set(req.sessionId, {})
      // 设置 session
      req.session = {}
    } else {
      // 设置 session
      req.session = sessionData

      // req.session 取到的是 userId 对应的那份数据
      console.log('SESSION_DATA', req.session)
    }
  })

  return Promise.resolve({ userId, needSetCookie })
}

// 统一的登录验证函数
const loginCheck = (req) => {
  if (!req.session.username) {
    return Promise.resolve('尚未登录')
  }
}

module.exports = {
  getPostData,
  getCookieExpires,
  parseCokie,
  parseSession,
  parseSessionWithRedis,
  loginCheck
}
